package org.truenewx.tnxjee.core.enums;

import java.util.Locale;

import org.truenewx.tnxjee.core.boot.ApplicationContextRunner;
import org.truenewx.tnxjee.core.i18n.TextResolver;

/**
 * 枚举字典解决器
 *
 * @author jianglei
 */
public interface EnumDictResolver extends TextResolver {

    /**
     * 布尔枚举类型的简称
     */
    String BOOLEAN_ENUM_TYPE = "boolean";

    /**
     * 初始化顺序号
     */
    int CONTEXT_INITIALIZE_ORDER = ApplicationContextRunner.DEFAULT_ORDER + 1;

    void addBasePackageName(String basePackageName);

    void addItemResolver(EnumItemResolver<?> itemResolver);

    /**
     * 从指定基础包集下的所有枚举类型初始化构建枚举字典
     *
     * @param locale           区域
     * @param basePackageNames 基础包名集
     * @return 枚举字典
     */
    EnumDict initialize(Locale locale, String... basePackageNames);

    EnumDict getEnumDict(Locale locale);

    /**
     * 获取指定类型和子类型确定的枚举子类型<br>
     * 如果无法找到则尝试构建并缓存，如果构建也失败，则返回null
     *
     * @param type    枚举类型
     * @param subType 枚举子类型
     * @param locale  地区
     * @return 指定类型和子类型确定的顶级枚举项
     */
    EnumType getEnumType(String type, String subType, Locale locale);

    EnumItem getEnumItem(Enum<?> enumConstant, Locale locale);

    EnumItem getEnumItem(String type, String subType, String key, Locale locale, String... keys);

    EnumItem getEnumItemByCaption(String type, String subType, String caption, Locale locale);

    EnumItem getEnumItemByValue(String type, String subType, String value, Locale locale);

    String getValue(String type, String subType, String key, String... keys);

    <E extends Enum<E>> E getEnumConstantByCaption(Class<E> enumClass, String caption, String groupCaption,
            Locale locale);

}
